//
// Created by 11510 on 2024/6/12.
//
#include <iostream>
using namespace std;
class FFF{
public:
    void print(int x){
        printf("FFF print %d\n", x);
    }

    void display(int x){
        printf("FFF display %d\n", x);
    }

    static void show(int x){
        printf("FFF show %d\n", x);
    }

};


void print(int x){
    printf("print %d\n", x);
}

void display(int x){
    printf("display %d\n", x);
}


/**
 * 给这种类型的函数指针总结出一个类型名称
 */
typedef void (*Function)(int);

void test0(){
    Function function = FFF::show;
    function(1);

}

/**
 * 给这种类型的成员函数指针变量总结出一个类型名称
 */
typedef void (FFF::*MemFunction)(int);
void test1(){
    /**
     * 定义一个成员函数指针时要确定属于哪个类、函数返回类型、参数信息
     * 定义时需要完整形式，加&
     * 使用也需要完整形式
     */
    void (FFF::*p)(int) = &FFF::print;
    FFF fff;
//    .*是成员指针访问运算符的第一种形式
    (fff.*p)(78);

    void (FFF::*p2)(int) = &FFF::print;
    (fff.*p2)(98);

    MemFunction p3 = &FFF::display;
    (fff.*p3)(101);


//    ->*是成员指针运算符的第二种形式
    FFF *fp = new FFF();
    (fp->*p3)(1);

//    BUG ?????
    fp = nullptr;
    (fp->*p3)(38);

}


void test2(){

}

int main() {
    test1();
    return 0;
}